package gov.nasa.anml.lifted;

import gov.nasa.anml.utility.SimpleObject;
import gov.nasa.anml.utility.SimpleVoid;

// This means the expression is constant with respect to its scope.  A constant is a single identifier that is constant in the same fashion;
// as such identifiers must be initialized, with expressions, the difference is whether or not the expression has/is-given a name.
// A non-intuitive but correct usage is '[start] f >= 3'  With respect to the scope it is in, and the trajectory up to that point, it is constant.
// 'f >= 3' is, in contrast, not a constant expression.  '[all] f >= 3' is a constant expression also --- it is either entirely true or false, 
// but, it is only finally initialized at [end].  That is, imagine 'constant boolean reserve-met = ([all] f >= 3);' 
// and compare with 'constant boolean reserve-met = \forall t \in [all] : f(t) >= 3;' to understand why the given expression is 'constant'.

// An easier way to understand the same thing: the past is immutable.
// This has a storage type, because constants aren't always constant, but the .storage() method in general returns null, 
// although that could easily change to some sort of empty History object (to avoid having to make null checks everywhere).
public interface ConstantExpression<T> extends Expression<T,SimpleVoid> {
}
